﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Collections.Generic;
using System.Linq;
using Biciq.Web.UI.Servicios;

namespace Biciq.Silverlight.UI
{
    public class EditarUsuarioVistaModelo:VistaModeloBase
    {
        #region campos
        private Usuario _UsuarioActual;
        private bool _modoEditar;
        private RelayCommand _comandoGuardar;
        private Recurso _selectedItem;
        private List<Recurso> _listaRecursos;
        private String _titulo;


        #endregion

        #region comandos


        
       
        #endregion

        #region propiedades



        /// <summary>
        /// Titulo de la pantalla
        /// </summary>
        public String Titulo
        {
            get { return _titulo; }
            set
            {
                _titulo = value;
                RaisePropertyChanged("Titulo");
            }
        }


        /// <summary>
        /// Propiedad para la lista de recursos
        /// </summary>
        public List<Recurso> ListaRecursos
        {
            get { return _listaRecursos; }
            set
            {
                _listaRecursos = value;
            }
        }

        /// <summary>
        /// Para recuperar el recurso seleccionado
        /// </summary>
        public Recurso SelectedItem
        {
            get { return _selectedItem; }
            set { _selectedItem = value; }
        }

        /// <summary>
        /// Usuario actual para editar o crear uno nuevo
        /// </summary>
        public Usuario UsuarioActual
        {
            get { return _UsuarioActual; }
            set
            {
                _UsuarioActual = value;
                _UsuarioActual.PropertyChanged += (ob, ev) =>
                {
                    //Indica si hubo cambios en el UsuarioActual
                    IsDirty = true;
                    RaisePropertyChanged("UsuarioActual." + ev.PropertyName);
                };
                RaisePropertyChanged("UsuarioActual");
            }
        }

        /// <summary>
        /// Propiedad que nos indica si un Usuario se va a editar
        /// </summary>
        public bool ModoEditar
        {
            get { return _modoEditar; }
            set
            {
                _modoEditar = value;
            }
        }


        #endregion

        #region constructores
        public EditarUsuarioVistaModelo(Usuario Usuario)
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo = RecursosLenguaje.Recursos.EditarUsuario;
            BiciqContexto.Usuarios.Clear();
            var Usuarios = BiciqContexto.Usuarios;
            BiciqContexto.Load(BiciqContexto.GetUsuarioIdQuery(Usuario.id)).Completed += delegate
            {
                UsuarioActual = Usuarios.FirstOrDefault();
                IsDirty = false;
            };

            _modoEditar = true;
        }

        public EditarUsuarioVistaModelo()
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            Titulo = RecursosLenguaje.Recursos.CrearUsuario;
            _modoEditar = false;
            UsuarioActual = new Usuario();
            
            UsuarioActual.estado = RecursosLenguaje.Recursos.Activo;
            UsuarioActual.id = Guid.NewGuid();
            IsDirty = false;
        }
        #endregion

        #region metodos privados

        /// <summary>
        /// Método en el cual se guarda el Usuario
        /// </summary>
        public override void  Guardar()

        {
            if (UsuarioActual.nombreUsuario == null)
            {
                UsuarioActual.nombreUsuario = string.Empty;
            }

            if (UsuarioActual.email == null)
            {
                UsuarioActual.email = string.Empty;
            }

            if (UsuarioActual.HasValidationErrors)
            {
                return;
            }

            BiciqDomainContext BiciqContextoaUX = new BiciqDomainContext();

            var Usuarios = BiciqContextoaUX.Usuarios.ToList();
            string titulo = string.Format(RecursosLenguaje.Recursos.Usuario.ToString());
            BiciqContextoaUX.Usuarios.Clear();
            BiciqContextoaUX.Load(BiciqContextoaUX.GetUsuarioNombreQuery(UsuarioActual.nombreUsuario)).Completed += delegate
            {
                Usuarios = BiciqContextoaUX.Usuarios.ToList();
                if (Usuarios.FirstOrDefault() != null && Usuarios.FirstOrDefault().id != UsuarioActual.id)
                {
                    AgregarMensajeError("Existe un usuario registrado con el mismo nombre"); 

                    MostrarErrores = Visibility.Visible;
                }
                else
                {
                    MostrarErrores = Visibility.Collapsed;
                    if (this.IsDirty)
                    {
                        if (!this.ModoEditar)
                        {
                            UsuarioActual.id = Guid.NewGuid();
                            BiciqContexto.Usuarios.Add(UsuarioActual);
                        }

                        BiciqContexto.SubmitChanges().Completed += delegate
                        {

                            if (!this.ModoEditar)
                            {
                                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeRegistroExitoso, titulo), titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                            }
                            else
                            {
                                LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar(string.Format(RecursosLenguaje.Recursos.MensajeActualizacionRegistro, titulo), titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Ok);
                            }

                            CerrarVentana();
                        };

                    }
                    else
                    {
                        CerrarVentana();
                    }

                }
            };
        }


        public override void Cancelar()
        {
            base.Cancelar(BiciqContexto);
        }
        #endregion

        #region metodos publicos

        #endregion
    }
}
